package iodevice;

/**
 * Klasse, deren Aufgabe es ist, Kommandos an die GUI zu senden.
 * @author Hewwa
 * @version V1.0.0.001 (28.9.'11)
 *
 */
public class CommandPhalanx {
	private static final String MOVEREGEX = "([a-h][1-8][a-h][1-8][rbnq]{0,1})|0000";
	
	/**
	 * Methode die die ID der Engine �ber UCI sendet.
	 * @param name Name der Engine.
	 * @param author Ersteller der Engine.
	 */
	public static void id(String name, String author){
		System.out.println("id name " + name + " id author " + author);
	}
	
	/**
	 * Methode die "uciok" �ber UCI sendet.
	 */
	public static void uciok() {
		System.out.println("uciok");
	}
	
	/**
	 * Methode die "readyok" �ber UCI sendet.
	 * Standartantwort auf "isready".
	 */
	public static void readyok() {
		System.out.println("readyok");
	}
	
	/**
	 * Methode die "bestmove" �ber UCI sendet.
	 * mit ponder mode: "bestmove(String, String) weiter unten.
	 * @param move Zug der gezogen werden soll.
	 */
	public static void bestmove(String move) {
		if (move.matches(MOVEREGEX))
			System.out.println("bestmove " + move);
		else
			throw new RuntimeException("kein regul�rer Zug angegeben");
		//TODO was, wenn kein Zug?
	}
	
	/**
	 * Methode die "bestmove" �ber UCI sendet.
	 * Diese Version gibt neben dem eigentlichen Zug noch die m�glichkeit,
	 * einen Zug f�r den Spieler vorrauszusehen
	 * @param move Zug, den die Engine ziehen will.
	 * @param ponder Zug, �ber den die Engine denkt, dass der Spieler ihn zieht.
	 */
	public static void bestmove(String move, String ponder) {
		if (move.matches(MOVEREGEX) && ponder.matches(MOVEREGEX))
			System.out.println(("bestmove " + move + " ponder " + ponder));
		else
			throw new RuntimeException("kein regul�rer Zug angegeben");
	}
	
	/**
	 * Methode, die einen String als Information �ber UCI sendet.
	 * @param info die Information
	 */
	public static void infoString(String info) {
		System.out.println("info string " + info);
	}
	
	/**
	 * Methode um eine Information �ber UCI zu senden
	 * @param info informations Typ und Wert in einem String
	 * 		  (bsp.: "currmove e2e4" oder "currmove e2e4 time 200")
	 */
	public static void info(String info) {
		System.out.println("info " + info);
	}
	
	/**
	 * Methode um eine Information �ber UCI zu senden
	 * @param infoArray informationen in einem Array, wobei im 
	 * 					1. Feld jeweils die Art der Information und im 
	 * 					2. Feld jeweils der Wert der Information gespeichert wird.
	 */
	public static void info(String[][] infoArray) {
		StringBuffer information = new StringBuffer(10);
		for (int i = 0; i < infoArray.length && infoArray[i][0] != null; i++) {
			if (infoArray[i][0] != null) {
				information.append(" " + infoArray[i][0]);
				if (infoArray[i][1] != null)
					information.append(" " + infoArray[i][1]);
			}
		}
		System.out.println("info" + information.toString());
	}
	
	/**
	 * Methode mit der eine Option per UCI versendet wird.
	 * @param option Die Option mit allen parametern als ein String
	 * 				 (bsp.: name Hash type spin default 1 min 1 max 128)
	 */
	public static void option(String option) {
		System.out.println("option " + option);
	}
	
	

}
